#include <bits/stdc++.h>
using namespace std;
#define FOR(i, a, b) for (int i = a; i <= b; ++i)
#define ROF(i, a, b) for (int i = a; i >= b; --i)
#define DEBUG(x) cerr << #x << '=' << x << endl

const int MAXN = 5e5 + 5; // <石头数量， 人的编号>
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>>
    q;
int n, a[MAXN];
int ans[MAXN];
int tag; // 小根堆的全局加标记，表示小根堆的每个元素实际要加上 tag

int main() {
  scanf("%d", &n);
  FOR(i, 1, n) scanf("%d", a + i);

  for (int i = 1; i <= n; ++i) { // i: 长大了
    a[i] += q.size();
    tag -= 1;                // 加入一个    a[i]
    q.push({a[i] - tag, i}); // 小根堆有的石头会变成0，需要弹出
    while (!q.empty() && q.top().first + tag == 0) {
      ans[q.top().second] = 0;
      q.pop();
    }
  }

  while (!q.empty()) {
    ans[q.top().second] = q.top().first + tag;
    q.pop();
  }

  for (int i = 1; i <= n; ++i)
    printf("%d ", ans[i]);
  return 0;
}